package com.example.demo.controller;

import com.example.demo.dao.MyBatisDao;
import com.example.demo.dao.MyJpaDao;
import com.example.demo.dao.UserDao;
import com.example.demo.entity.Student;
import com.example.demo.entity.User;
import com.example.demo.server.MyAsyncService;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import java.util.List;
import java.util.Random;
import java.util.concurrent.TimeUnit;

//不需要登陆就可以正常使用的接口都放这里，比如登陆，注册，获取验证码等接口
@RestController
@RequestMapping("/noLogin")
public class NoLoginController {
    @Resource
    UserDao userDao;

    //登陆接口
    @PostMapping("login")
    public String login(String user, String pwd) {
        //调用数据库操作类，查找对应表里有没有数据匹配
        List<User> users = userDao.findByUsernameAndPassword(user, pwd);
        if(users.size()>0){//如果有，登陆成功，
//            返回用户名作为token，实际开发中，应该还含有过期时间，然后加密的一个字符串
//            get(0)表示获取数组的第一个，一般来说用户名和密码应该是数据库里的唯一值
//            不存在两个用户名一样的用户，所以查找的数组长度应该是1
            //24*60*60*1000表示一天
            long time = System.currentTimeMillis()+24*60*60*1000;
            return users.get(0).getUsername()+"|"+time;
        }else {//查找不到对应的用户数据
            return "";//返回空，此时要在前端提示登录失败
        }

    }
    //注册接口
    @GetMapping("register")
    public String register(String user, String pwd,String code) {
//        1.判断这3个参数对不对，有没有数据
//          2.判断验证码和缓存中的验证码是不是一致
//        3.判断数据库中有没有这个用户名
//        4.把用户名和密码插入用户表
//            5.返回注册成功
        if(user==null||user.equals("")){
            return "请输入邮箱";
        }
        if(pwd==null||pwd.equals("")){
            return "请输入密码";
        }
        if(code==null||code.equals("")){
            return "请输入验证码";
        }
        int codeRedis = (int) redisTemplate.opsForValue().get(user);//从缓存中拿验证码
        if(!code.equals(codeRedis+"")){//判断前段传过来的验证码和缓存中的验证码是不是一致
            return "验证码错误";
        }
        List<User> list = userDao.findByUsername(user);
        if(list.size()>0){//如果查出来的结果长度大于0，表明存在这个用户名
            return "该用户名已注册";
        }
        User userObj = new User();
        userObj.setUsername(user);
        userObj.setPassword(pwd);
        userDao.save(userObj);//保存
        return "注册成功，请前往登录";
    }
    @Resource
    RedisTemplate redisTemplate;
    @Resource
    MyAsyncService myAsyncService;
    //登陆接口
    @GetMapping("getCode")
    public String getCode(String email) throws InterruptedException {
//        1.先生成一个随机验证码；
//        2.把这个验证码存起来，可以存到redis缓存，也可以存到数据库
//        3.把验证码发给对应的邮箱
//        4.返回发送成功的结果
//        5.返回给前端，告诉前端验证码已发送到手机或者邮箱，请注意查收
        Long satrt = System.currentTimeMillis();
        //0到899999 new Random().nextInt(899999)
        int code = new Random().nextInt(899999)+100000;//100000
        redisTemplate.opsForValue().set(email,code,3,TimeUnit.MINUTES);//设置缓存时间为3分
//        Thread.sleep(2000);//延时2秒执行后面的代码，模拟发邮件给email耗时
        myAsyncService.sendSms(email,code);
        Long end = System.currentTimeMillis();
        Long time =  end - satrt ;
        System.out.println("该业务执行完成耗时："+time);
        return "验证码已发送到手机或者邮箱，请注意查收";
    }
    @Resource
    MyBatisDao myBatisDao;
    @GetMapping("getStu")
    public Student getStu(int id){
        return myBatisDao.findStuById(id);
    }
    @Resource
    MyJpaDao myJpaDao;
    @GetMapping("getStus")
    public List<Student> getStus(int id){
        return myJpaDao.getStuByAId(id);
    }
}
